// 卫星实时数据服务
// 用于调用卫星实时数据相关的API接口
import axios from 'axios';

// 创建axios实例，配置基础URL和超时时间
const satelliteApi = axios.create({
  baseURL: 'http://192.168.128.133:8080/api',
  // baseURL: 'http://172.18.45.102:5000/api',
  // baseURL: 'http://192.168.1.178:5000/api',
  // baseURL: 'http://127.0.0.1:5000/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 创建监听器集合
const dataReceivedListeners = new Set();

/**
 * 注册数据接收监听器
 * @param {Function} listener - 监听器函数，接收(data, system)参数
 * @returns {Function} 取消订阅的函数
 */
export const onDataReceived = (listener) => {
  dataReceivedListeners.add(listener);
  return () => {
    dataReceivedListeners.delete(listener);
  };
}

/**
 * 获取卫星实时数据
 * @param {string|null} system - 卫星系统名称（可选，如'bds'、'gps'等）
 * @returns {Promise<Object>} 包含卫星实时数据的响应对象
 */
export const getSatelliteRealtimeData = async (system = null, page = 1, pageSize = 100) => {
  try {
    // 构建参数对象，将system添加到params中
    const params = { page, pageSize };
    if (system) {
      params.system = system;
    }
    // 使用固定URL路径
    const url = '/satellite/realtime';
    console.log('请求卫星数据URL:', url);
    const response = await satelliteApi.get(url, { params });
    console.log('卫星数据响应:', response.data);
    // 通知所有监听器
    dataReceivedListeners.forEach(listener => {
      try {
        listener(response.data, system);
      } catch (error) {
        console.error('监听器执行错误:', error);
      }
    });
    return response.data;
  } catch (error) {
    // 增强错误信息输出，便于调试
    console.error('获取卫星实时数据失败详情:', {
      message: error.message,
      status: error.response?.status,
      statusText: error.response?.statusText,
      data: error.response?.data,
      config: error.config
    });
    // 统一错误处理，包含更多上下文信息
    const errorMsg = error.response?.data?.message || 
                    `[${error.response?.status || '未知状态'}] ${error.response?.statusText || '请求失败'}`;
    throw new Error(`获取卫星数据时发生错误: ${errorMsg}`);
  }
};

// 导出服务对象，便于后续扩展更多方法
export const getPositionData = async () => {
    try {
        const response = await satelliteApi.get('/position/realtime');
        return response.data;
    } catch (error) {
        console.error('获取位置数据失败:', error);
        throw new Error('获取位置数据时发生错误');
    }
};

// 获取系统时间
export const getSystemTime = async () => {
    try {
        const response = await satelliteApi.get('/time/realtime');
        return response.data;
    } catch (error) {
        console.error('获取系统时间数据失败:', error);
        throw new Error('获取系统时间数据时发生错误');
    }
};

// 获取天空图数据
export const getSkyPlotData = async () => {
    try {
        const response = await satelliteApi.get('/satellite/skyplot');
        return response.data.data.satellites;
    } catch (error) {
        console.error('获取天空图数据失败:', error);
        throw new Error('获取天空图数据时发生错误');
    }
};

// 获取卫星跟踪数据
export const getSatelliteTrackingData = async () => {
    try {
        const response = await satelliteApi.get('/satellite/tracking');
        return response.data.data;
    } catch (error) {
        console.error('获取卫星跟踪数据失败:', error);
        throw new Error('获取卫星跟踪数据时发生错误');
    }
};

// 导出服务对象
export const satelliteService = {
  getRealtimeData: getSatelliteRealtimeData,
  getPositionData: getPositionData,
  getSystemTime: getSystemTime,
  getSatelliteTrackingData: getSatelliteTrackingData,
  getSkyPlotData: getSkyPlotData, // 天空图数据获取方法
};

export default satelliteService;